<?php

namespace app\admin\controller;

use think\Controller;
use think\facade\Request;
use think\Db;
class Base extends Controller
{
    //自动加载
    public function __construct(){
    	parent::__construct();
        if(!session('?uid')){
            $this->redirect('admin/login/index');
        }
        $this->checkRbac();
        $this->roleList();
        $this->view->engine->layout(true);
    }
    // 退出登录
    public function logout(){
        session(null);
        $this->success('退出成功','login/index');
    }
    // 切换角色
    public function changeRole(int $id){
        $role=Db::table('sys_role_user')->where('user_id',session('user_id'))->field('role_id')->select();
        $rid=array_column($role,'role_id');
        if(in_array($id, $rid)){
            $menus=$this->getUserMenu($id);
            session('menu_array',$menus);
            $functions=$this->getUserMenuUrl($id);
            session('functions_array',$functions);
            $role_name=Db::table('sys_role')->where('id',$id)->value('role_name');
            session('role_name',$role_name);
        }
        return json(['code'=>200,'msg'=>'ok','data'=>null]);
    }
    // 菜单检查并赋值
    protected function checkRbac(){
        // 判断是否存在菜单
        if(!session('?menu_array')){
            $menus=$this->getUserMenu(session("role_id"));
            session('menu_array',$menus);
        }
        // 显示菜单
        $this->assign('sys_menu',session('menu_array'));
        // 检查请求权限
        if(!session('?functions_array')){
            $functions=$this->getUserMenuUrl(session("role_id"));
            session('functions_array',$functions);
        }
        // dump(session('functions_array'));
        // 获取当前请求的菜单  
        $request = Request::instance();  
        $m=$request->module();
        $c=$request->controller();
        $a=$request->action();
        $url=strtolower($m.'/'.$c.'/'.$a);
        if($a=="logout" || $url=='admin/index/index' || $url=='admin/index/changerole'){
        }else{
            // 控制器区分大小写
            // dump(session('functions_array'));
            // dump(array_map('strtolower', session('functions_array')));die;
            $function_info=in_array($url,array_map('strtolower', session('functions_array')));
            // var_dump($function_info);die;
            if(!$function_info) {$this->error('模块不存在或者您无权限访问此模块!');exit;}
        }
    }
    // 获取当前用户的所有角色
    protected  function  roleList(){
        $role=Db::table('sys_role_user')->where('user_id',session('user_id'))->field('role_id')->select();
        $rid=array_column($role,'role_id');
        $res=Db::table('sys_role')->where(['id'=>$rid])->select();
        $this->assign('rolelist',$res);
        // 设置session
    }
    // 获取某个角色对应的用户菜单
    public function getUserMenu($rid){
        // 获取当前角色的所有的菜单id
        $res=Db::table('sys_menu_role')->where(['status_id'=>1,'role_id'=>$rid])->field('menu_id')->select();
        // 取出所有menu_id
        $res=array_column($res,'menu_id');
        // 查询菜单
        $menus=Db::table('sys_menu')->where(['id'=>$res,'status_id'=>1])->order('sort', 'desc')->select();
        // 无限极分类归纳菜单
        $data=genTree($menus,$id='id',$pid='parent_id',$son = 'children');
        return $data;
    }
    // 获取所有的菜单,先写上，暂时不需要
    public function getAllMenu(){
        // 查询菜单
        $menus=Db::table('sys_menu')->where(['status_id'=>1])->order('sort', 'desc')->select();
        // 无限极分类归纳菜单
        $data=genTree($menus,$id='id',$pid='parent_id',$son = 'children');
        return $data;
    }
    // 获取获取某个角色对应的用户菜单不组合
    public function getUserMenuUrl($rid){
        // 获取当前角色的所有的菜单id
        $res=Db::table('sys_menu_role')->where(['status_id'=>1,'role_id'=>$rid])->field('menu_id')->select();
        // 取出所有menu_id
        $res=array_column($res,'menu_id');
        // 查询菜单
        $menus=Db::table('sys_menu')->where(['id'=>$res,'status_id'=>1])->field('menu_url')->order('sort', 'desc')->select();
        // 取出所有menu_url
        $menus=array_column($menus,'menu_url');
        return $menus;

    }
    // 获取所有的菜单不组合,先写上，暂时不需要
    public function getAllMenuUrl(){
        // 查询菜单
        $menus=Db::table('sys_menu')->where(['status_id'=>1])->field('menu_url')->order('sort', 'desc')->select();
        // 取出所有menu_url
        $menus=array_column($menus,'menu_url');
        return $menus;
    }
}
